Cloud LoggingでOpenAI APIのエラーをSlackに通知してみた

Cloud LoggingでOpenAI APIのエラーをSlackに通知してみた

Cloud Functionsから叩いているOpenAI APIのエラーをCloud Loggingを使ってSlackにエラー通知として飛ばす方法についてまとめました。
Clock Icon2024.07.25

機械学習チームのShirotaです。
今回は、OpenAI APIでエラーが発生した時にSlack上で通知を受け取れるような仕組みを作ってみました。

前提

現在、OpenAI APIをGoogle CloudのCloud Functionsから呼び出し様々な処理を実施しています。
OpenAI APIでエラーが発生した際には、Cloud Functionsのコンソールから確認できるログに標準出力として出力したエラーを見にいくように実装していました。

main.py
try:
    response = client.chat.completions.create(model=request_gpt_model_version, messages=[{"role": "user", "content": request_content}], temperature=float(request_gpt_option_temperature), timeout=180)except Except as gpt_error:
    print(f"Error: {gpt_error}")

この運用には2点ほど問題がありました。

  1. Cloud Functionsのコンソールを確認しに行かないとエラー内容やエラーが起きているのかが分からない

Cloud Functionsのログのタブから、エラー内容の確認はできます。
Cloud-Logging-notify-Slack-01
しかし、Cloud Functionsの動作としては「標準出力としてエラーメッセージを出力して正常に処理を完了した」状態なのでログを確認するまではOpenAI APIがエラーを返したのかどうかが判断できませんでした。

  1. 標準出力で出力されるログにはログレベルが関連づけられていない

Cloud Functionsのログに関して、公式ドキュメントには以下の記載があります。

標準出力または標準エラーに出力されるログにはログレベルが関連付けられていません。
内部システム メッセージのログレベルは DEBUG です。

https://cloud.google.com/functions/docs/monitoring/logging?hl=ja

現状だとログレベルがつけられないため、ログレベルがERRORの時に通知する設定をしたとしてもOpenAI APIのエラー時には通知されません。
この問題を解消するために、以下の対応を実施しました。

  1. Cloud Loggingでログベースのアラートポリシーを設定してSlackに通知する
  2. ログレベルを関連づけたログを送信できるように実装を変更する

これを実施することでOpenAI APIでエラーが発生した時にSlack上で通知を受け取れるようになり、よりリアルタイムでOpenAI APIからのレスポンスがどのような状態になっているのかを確認できるようになりました。

実際に作ってみた

ここからは、実際にこの仕組みを作る手順やコードについてまとめていきます。

構成

以下の構成で構築しました。
Cloud-Logging-notify-Slack-02

Cloud Functionsの実装

Google Cloudの公式ドキュメントを参考にCloud Loggingライブラリの導入と実装を行います。
https://cloud.google.com/blog/ja/products/devops-sre/google-cloud-logging-python-client-library-v3-0-0-release
https://cloud.google.com/python/docs/reference/logging/latest/google.cloud.logging_v2.handlers.handlers.CloudLoggingHandler

今回は2024年7月25日時点で最新のライブラリを選択しました。
https://pypi.org/project/google-cloud-logging/

requirements.txt
︙
google-cloud-logging==3.10.0
︙

実装は以下のようになります。

main.py
import logging
import google.cloud.logging
︙
from google.cloud.logging_v2.handlers import CloudLoggingHandler
︙
def openai_chat(request):
    """
    requestで受け取ったプロンプトをGPTに渡し、結果を返す
    """
︙
    logging_client = google.cloud.logging.Client()
    handler = CloudLoggingHandler(logging_client)

    cloud_logger = logging.getLogger('cloudLogger')
    cloud_logger.setLevel(logging.INFO)
    cloud_logger.addHandler(handler)

    try:
        response = client.chat.completions.create(model=request_gpt_model_version, messages=[{"role": "user", "content": request_content}], temperature=float(request_gpt_option_temperature), timeout=180)except Except as gpt_error:
        cloud_logger.error(f"Error: {gpt_error}")

実際にOpenAI APIでエラーが発生すると、cloud_logger.errorで設定したログレベルのログがCloud Logging上で確認できるようになりました。
Cloud-Logging-notify-Slack-03

補足

ここで設定したエラーログは、(少なくとも第2世代の)Cloud Functionsのコンソールから確認できるログのタブからは確認できません。
Cloud Functionsコンソールから確認できるログは、以下のリソースタイプになっていました。

︙
"resource": {
    "type": "cloud_run_revision",
︙
  }
︙

第2世代のCloud FunctionsはCloud RunとEventarcをベースに作られたものなので、標準出力のログもこのcloud_run_revisionになっています。
対して、今回設定したCloud Logging用のログは以下のリソースタイプになっています。

︙
"resource": {
    "type": "cloud_function",
︙
    }
︙

このようにリソースタイプが異なるため、今回設定したログは第2世代のCloud Functionsのコンソール上からは確認できなくなっています。

Cloud Loggingの設定

先ほど設定したERRORログをSlackに通知させるため、Cloud Loggingの設定を行います。

ログベースのアラートポリシーを作成する

Cloud Loggingのコンソールからアラートを作成を選択します。
Cloud-Logging-notify-Slack-04

アラートの概要を設定します。
今回は以下のように設定しました。

  • Alert Policy Name
    • OpenAI Error Alart
  • Policy Severity Level
    • Error
      • 通知したいログレベルを選択
  • Documentation
    • エラー通知に表示されるドキュメントを編集できる(ドキュメント内容は後述)

次にアラートを発報したいログをCloud Loggingのクエリで絞りこみます。
Cloud-Logging-notify-Slack-06
今回はリソースタイプがcloud_functionでログレベルがERRORのログが発生した時にアラートを発報するように以下クエリを設定しました。

severity=ERROR
resource.type="cloud_function"

入力欄の右上にあるPreview logsからは実際に入力したクエリで引っかかるログを表示してくれます。
発報したいログだけが引っかかるクエリになっているかをここで確認しておくことをおすすめします。
次にログラベルを作成します。
ログのフィールド名を結びつけ、作成したラベルをlog.extracted_label.<ラベルのDisplay name>と記述すると前述したDocumentationでログの情報を表示できるようになります。
今回出力しているERRORログはtextPayloadに格納されているので、以下のようにラベルを作成しました。
Cloud-Logging-notify-Slack-07
今回はtextという名前のラベルを作成したので、Documentationに以下のような記述をしてラベルに紐づけたログのフィールド情報を出力させるように設定しました。

設定したCloud FunctionsのErrorログを通知する
- エラーメッセージ: ${log.extracted_label.text}

次に通知間隔と通知されたインシデントの自動クローズ期間を設定します。
実際に設定する際は運用したい状況に合わせて適切な時間幅を設定してください。
Cloud-Logging-notify-Slack-08
最後に、Slackの通知させたいワークスペースのチャンネルの設定をします。
Cloud-Logging-notify-Slack-09
Manage Notification Channelsを選択すると、以下のような各種ツールへの通知を作成できるページが表示されます。
Cloud-Logging-notify-Slack-10
Add Newを選択すると現在ログインしているワークスペースとの連携許可を求める画面が表示されるので、通知させたいワークスペースかを確認してから許可するを選択します。
Cloud-Logging-notify-Slack-11
各種ツールと連携した通知の設定を行うのはGoogle Cloud Monitoringなので、上記のようにCloud Monitoringとの連携の許可を確認されます。
最後に通知させたいチャンネルを設定します。
Cloud-Logging-notify-Slack-12
ここには表示されていませんが初回設定時には通知テストを実施するボタンが用意されています。
実際に選択すると、以下のように通知が設定しようとしているチャンネルに行くはずです。
Cloud-Logging-notify-Slack-13
ここまでの設定を保存すれば、アラートポリシーの設定は完了です。

実際に試してみた

OpenAI APIにエラーが発生した時、Slackには以下のように通知されました。
Cloud-Logging-notify-Slack-14
これでOpenAIのAPIのエラーをよりリアルタイムに確認でき、エラーの内容もSlackから確認できるようになりました。

この記事が、Cloud FunctionsでOpenAI APIを利用している人の運用における助けになれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.